import { getToken, setToken } from '@/utils/local'
import axios from 'axios'
let isRefreshing = false
const requests: any[] = []
const getTokenByRefreshToken = async () => {
  return request.get('/refreshToken', {
    params: {
      refreshToken: getToken('refreshToken')
    }
  })
}

export const request = axios.create({
  baseURL: '/v2',
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 添加请求拦截器
request.interceptors.request.use(
  function (config) {
    // 请求头携带token
    const token = getToken()
    if (token) {
      config.headers.authorization = token
    }

    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
request.interceptors.response.use(
  function (response) {
    const { errno } = response.data
    if (errno) {
      switch (errno) {
        // token 解析失败
        case 101004: {
          if (!isRefreshing) {
            isRefreshing = true
            // 获取本地缓存中的RefreshToken
            getTokenByRefreshToken().then((resp) => {
              const { token } = resp.data.data
              setToken('token', token)
              // 已经刷新了token，将所有队列中的请求进行重试
              requests.forEach((item) => item(resp.data.data.token))
              requests.length = 0
              return resp
            }).finally(() => {
              // 请求成功，开启刷新标识
              isRefreshing = false
            })

          }
          return new Promise((resolve) => {
            // 将resolve放进队列，用一个函数形式来保存，等token刷新后直接执行
            requests.push((token) => {
              response.config.headers.authorization = token
              resolve(request(response.config)) //执行请求，
            })
          })
        }
      }
    }
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)



